########################################################################
# WAŻNE: Zmienić BOOSTLIBDIR chyba że biblioteki boost linkują się
# domyślnie (są w PATH <-- raczej po instalacji z pomocą bjam)
########################################################################

########################################################################
# Zawartosc katalogow
########################################################################

# katalogi ----------------------------------------------------------- #

SRC_DIR = src

COMM_DIR := $(SRC_DIR)/comm
COMM_SSL_DIR := $(SRC_DIR)/comm/ssl
COMM_TCP_DIR := $(SRC_DIR)/comm/tcp
CONF_DIR := $(SRC_DIR)/config
DB_DIR := $(SRC_DIR)/db
FILT_DIR := $(SRC_DIR)/filter
FILT_COND_DIR := $(SRC_DIR)/filter/cond
#LDAP_DIR := $(SRC_DIR)/ldap
LOGS_DIR := $(SRC_DIR)/logs
MIME_CORE_DIR := $(SRC_DIR)/mime/core
MIME_DATA_DIR := $(SRC_DIR)/mime/data
PARS_DIR := $(SRC_DIR)/parser
SMTP_CORE_DIR := $(SRC_DIR)/smtp/core
SMTP_DATA_DIR := $(SRC_DIR)/smtp/data
SYST_DIR := $(SRC_DIR)/system
UTIL_DIR := $(SRC_DIR)/utils
WWW_DIR := $(SRC_DIR)/www

# katalogi obiektow -------------------------------------------------- #

OBJ_DIR = src/obj

COMM_OBJ_DIR := $(OBJ_DIR)/comm
CONF_OBJ_DIR := $(OBJ_DIR)/config
DB_OBJ_DIR := $(OBJ_DIR)/db
FILT_OBJ_DIR := $(OBJ_DIR)/filter
#LDAP_OBJ_DIR := $(OBJ_DIR)/ldap
LOGS_OBJ_DIR := $(OBJ_DIR)/logs
MIME_OBJ_DIR := $(OBJ_DIR)/mime
PARS_OBJ_DIR := $(OBJ_DIR)/parser
SMTP_OBJ_DIR := $(OBJ_DIR)/smtp
SYST_OBJ_DIR := $(OBJ_DIR)/system
UTIL_OBJ_DIR := $(OBJ_DIR)/utils

# pliki naglowkowe --------------------------------------------------- #

COMM_HDRS = $(wildcard $(COMM_DIR)/*.h)
COMM_SSL_HDRS = $(wildcard $(COMM_SSL_DIR)/*.h)
COMM_TCP_HDRS = $(wildcard $(COMM_TCP_DIR)/*.h)
CONF_HDRS = $(wildcard $(CONF_DIR)/*.h)
DB_HDRS = $(wildcard $(DB_DIR)/*.h)
FILT_HDRS = $(wildcard $(FILT_DIR)/*.h)
FILT_COND_HDRS = $(wildcard $(FILT_COND_DIR)/*.h)
#LDAP_HDRS =  $(wildcard $(LDAP_DIR)/*.h)
LOGS_HDRS = $(wildcard $(LOGS_DIR)/*.h)
MIME_CORE_HDRS = $(wildcard $(MIME_CORE_DIR)/*.h)
MIME_DATA_HDRS = $(wildcard $(MIME_DATA_DIR)/*.h)
PARS_HDRS = $(wildcard $(PARS_DIR)/*.h)
SMTP_CORE_HDRS = $(wildcard $(SMTP_CORE_DIR)/*.h)
SMTP_DATA_HDRS = $(wildcard $(SMTP_DATA_DIR)/*.h)
SYST_HDRS = $(wildcard $(SYST_DIR)/*.h)
UTIL_HDRS = $(wildcard $(UTIL_DIR)/*.h)
ALL_HDRS = $(COMM_SSL_HDRS) $(COMM_TCP_HDRS) \
	$(CONF_HDRS) $(DB_HDRS) $(FILT_HDRS) \
	$(FILT_COND_HDRS) $(LOGS_HDRS) $(MIME_CORE_HDRS) \
	$(MIME_DATA_HDRS) $(PARS_HDRS) $(SMTP_CORE_HDRS) \
	$(SMTP_DATA_HDRS) $(SYST_HDRS) $(UTIL_HDRS)
	# $(LDAP_HDRS)

# pliki zrodlowe ----------------------------------------------------- #

#COMM_CPPS = $(wildcard $(COMM_DIR)/*.cpp)
COMM_SSL_DIRCPPS := $(wildcard $(COMM_SSL_DIR)/*.cpp)
COMM_TCP_DIRCPPS := $(wildcard $(COMM_TCP_DIR)/*.cpp)
CONF_DIRCPPS := $(wildcard $(CONF_DIR)/*.cpp)
DB_DIRCPPS := $(wildcard $(DB_DIR)/*.cpp)
FILT_DIRCPPS := $(wildcard $(FILT_DIR)/*.cpp)
FILT_COND_DIRCPPS := $(wildcard $(FILT_COND_DIR)/*.cpp)
#LDAP_DIRCPPS =  $(wildcard $(LDAP_DIR)/*.cpp)
LOGS_DIRCPPS := $(wildcard $(LOGS_DIR)/*.cpp)
MIME_CORE_DIRCPPS := $(wildcard $(MIME_CORE_DIR)/*.cpp)
MIME_DATA_DIRCPPS := $(wildcard $(MIME_DATA_DIR)/*.cpp)
PARS_DIRCPPS := $(wildcard $(PARS_DIR)/*.cpp)
SMTP_CORE_DIRCPPS := $(wildcard $(SMTP_CORE_DIR)/*.cpp)
SMTP_DATA_DIRCPPS := $(wildcard $(SMTP_DATA_DIR)/*.cpp)
SYST_DIRCPPS := $(wildcard $(SYST_DIR)/*.cpp)
UTIL_DIRCPPS := $(wildcard $(UTIL_DIR)/*.cpp)

#COMM_CPPS = $(wildcard $(COMM_DIR)/*.cpp)
COMM_SSL_CPPS := $(notdir $(COMM_SSL_DIRCPPS))
COMM_TCP_CPPS := $(notdir $(COMM_TCP_DIRCPPS))
CONF_CPPS := $(notdir $(CONF_DIRCPPS))
DB_CPPS := $(notdir $(DB_DIRCPPS))
FILT_CPPS := $(notdir $(FILT_DIRCPPS))
FILT_COND_CPPS := $(notdir $(FILT_COND_DIRCPPS))
#LDAP_CPPS =  $($(notdir $(LDAP_DIRCPPS))
LOGS_CPPS := $(notdir $(LOGS_DIRCPPS))
MIME_CORE_CPPS := $(notdir $(MIME_CORE_DIRCPPS))
MIME_DATA_CPPS := $(notdir $(MIME_DATA_DIRCPPS))
PARS_CPPS := $(notdir $(PARS_DIRCPPS))
SMTP_CORE_CPPS := $(notdir $(SMTP_CORE_DIRCPPS))
SMTP_DATA_CPPS := $(notdir $(SMTP_DATA_DIRCPPS))
SYST_CPPS := $(notdir $(SYST_DIRCPPS))
UTIL_CPPS := $(notdir $(UTIL_DIRCPPS))

# pliki linkera ------------------------------------------------------ #

COMM_SSL_OBJS = $(patsubst %.cpp,$(COMM_OBJ_DIR)/%.o,$(COMM_SSL_CPPS))
COMM_TCP_OBJS = $(patsubst %.cpp,$(COMM_OBJ_DIR)/%.o,$(COMM_TCP_CPPS))
CONF_OBJS := $(patsubst %.cpp,$(CONF_OBJ_DIR)/%.o,$(CONF_CPPS))
CONF_OBJS := $(filter-out $(CONF_OBJ_DIR)/ConfigFileReader.o,$(CONF_OBJS))
CONF_OBJS := $(filter-out $(CONF_OBJ_DIR)/XmlTag.o,$(CONF_OBJS))
DB_OBJS = $(patsubst %.cpp,$(DB_OBJ_DIR)/%.o,$(DB_CPPS))
FILT_OBJS = $(patsubst %.cpp,$(FILT_OBJ_DIR)/%.o,$(FILT_CPPS))
FILT_COND_OBJS = $(patsubst %.cpp,$(FILT_OBJ_DIR)/%.o,$(FILT_COND_CPPS))
LDAP_OBJS =  $(patsubst %.cpp,$(LDAP_OBJ_DIR)/%.o,$(LDAP_CPPS))
LOGS_OBJS = $(patsubst %.cpp,$(LOGS_OBJ_DIR)/%.o,$(LOGS_CPPS))
MIME_CORE_OBJS = $(patsubst %.cpp,$(MIME_OBJ_DIR)/%.o,$(MIME_CORE_CPPS))
MIME_DATA_OBJS = $(patsubst %.cpp,$(MIME_OBJ_DIR)/%.o,$(MIME_DATA_CPPS))
PARS_OBJS := $(patsubst %.cpp,$(PARS_OBJ_DIR)/%.o,$(PARS_CPPS))
PARS_OBJS := $(PARS_OBJS) $(PARS_DIR)/bison.o $(PARS_OBJ_DIR)/flex.o 
SMTP_CORE_OBJS = $(patsubst %.cpp,$(SMTP_OBJ_DIR)/%.o,$(SMTP_CORE_CPPS))
SMTP_DATA_OBJS = $(patsubst %.cpp,$(SMTP_OBJ_DIR)/%.o,$(SMTP_DATA_CPPS))
SYST_OBJS = $(patsubst %.cpp,$(SYST_OBJ_DIR)/%.o,$(SYST_CPPS))
UTIL_OBJS = $(patsubst %.cpp,$(UTIL_OBJ_DIR)/%.o,$(UTIL_CPPS))

ALL_OBJS = $(COMM_SSL_OBJS) $(COMM_TCP_OBJS) \
	$(CONF_OBJS) $(DB_OBJS) $(FILT_OBJS) $(FILT_COND_OBJS) \
	$(LOGS_OBJS) $(MIME_DATA_OBJS) $(MIME_CORE_OBJS) \
	$(PARS_OBJS) $(SMTP_DATA_OBJS) $(SMTP_CORE_OBJS) \
	$(SYST_OBJS) $(UTIL_OBJS)
	# $(LDAP_OBJS)
	
########################################################################
# Uzywane programy
########################################################################

OPENSSL_INCL_DIR = /usr/include/openssl
OPENSSL_LFLAGS = -L/usr/lib -lssl -L/lib -lcrypto

BOOST_LFLAGS = -L/usr/lib -lboost_regex -lboost_thread-mt -lboost_system \
	-lboost_filesystem -lboost_chrono

LDAP_LFLAGS = -lldap

MYSQL_INCL_DIR = /usr/include
MYSQL_LFLAGS = -L/usr/lib/mysql -lmysqlclient -lboost_date_time

ICU_LFLAGS = -licuuc -licui18n -licuio

CPPFLAGS = -Wall -pedantic -g -I$(OPENSSL_INCL_DIR) -I$(MYSQL_INCL_DIR)
LFLAGS = $(BOOST_LFLAGS) $(LDAP_LFLAGS) $(MYSQL_LFLAGS) $(ICU_LFLAGS) $(OPENSSL_LFLAGS)

CXX = g++
STLPORT = -library=stlport4
COMPILE = $(CXX) $(CPPFLAGS) -c
LINK = $(CXX) $(LFLAGS)

YACC = bison --defines=$(PARS_DIR)/BisonParser.h --verbose -d --warnings=none
FLEX = flex --header-file=$(PARS_DIR)/FlexDefs.h -p -f

########################################################################
# Reguly kompilacji
########################################################################
	
all: r demon

r: $(ALL_OBJS)
	$(LINK) $^ -o r

# Comm --------------------------------------------------------------- #

$(COMM_OBJ_DIR)/%.o: $(COMM_SSL_DIR)/%.cpp
	$(COMPILE) $< -o $@ 
	
$(COMM_OBJ_DIR)/%.o: $(COMM_TCP_DIR)/%.cpp
	$(COMPILE) $< -o $@ 

# Config ------------------------------------------------------------- #

$(CONF_OBJ_DIR)/%.o: $(CONF_DIR)/%.cpp
	$(COMPILE) $< -o $@

# Db ----------------------------------------------------------------- #

$(DB_OBJ_DIR)/%.o: $(DB_DIR)/%.cpp
	$(COMPILE) $< -o $@

# Ldap --------------------------------------------------------------- #

$(LDAP_OBJ_DIR)/%.o: $(LDAP_DIR)/%.cpp 
	$(COMPILE) $< -o $@

# Logs --------------------------------------------------------------- #

$(LOGS_OBJ_DIR)/%.o: $(LOGS_DIR)/%.cpp
	$(COMPILE) $< -o $@

# Parser ------------------------------------------------------------- #

$(PARS_OBJ_DIR)/%.o: $(PARS_DIR)/%.cpp
	$(COMPILE) $< -o $@
	
$(PARS_OBJ_DIR)/fscanner.o: $(PARS_DIR)/FlexScanner.cpp $(PARS_DIR)/scanner.yy.cc $(PARS_DIR)/BisonParser.cc
	$(COMPILE) -c $(PARS_DIR)/FlexScanner.cpp -o $@

$(PARS_DIR)/scanner.yy.cc: $(PARS_DIR)/Scanner.l $(PARS_HDRS)
	$(FLEX) -o $(PARS_DIR)/scanner.yy.cc $(PARS_DIR)/Scanner.l
	@# modyfikuje plik naglowkowy generowany przez flexa, tak, aby 
	@# nie powodowal bledow kompilacji
	@sed -e '1i \/* Plik naglowkowy skanera flex, zmodyfikowany za pomoca programu sed *\/\n' \
		-e '/#include <FlexLexer.h>/i \\n\/* Wyeliminowanie bledu programu flex++ *\/ \n\n#undef yyFlexLexer' \
		-e '/int yyFlexLexer::yywrap() { return 1; }/d' \
		$(PARS_DIR)/FlexDefs.h > $(PARS_DIR)/tmp
	@cat $(PARS_DIR)/tmp > $(PARS_DIR)/FlexDefs.h
	@rm -f $(PARS_DIR)/tmp

$(PARS_OBJ_DIR)/flex.o: $(PARS_DIR)/scanner.yy.cc
	$(CXX) -c $< -o $@

$(PARS_DIR)/BisonParser.cc: $(PARS_DIR)/Parser.y $(PARS_HDRS)
	$(YACC) $(PARS_DIR)/Parser.y -o $@

$(PARS_DIR)/bison.o: $(PARS_DIR)/BisonParser.cc
	$(COMPILE) -c $(PARS_DIR)/BisonParser.cc -o $@
	
# Mime --------------------------------------------------------------- #

$(MIME_OBJ_DIR)/%.o: $(MIME_CORE_DIR)/%.cpp
	$(COMPILE) $< -o $@

$(MIME_OBJ_DIR)/%.o: $(MIME_DATA_DIR)/%.cpp
	$(COMPILE) $< -o $@
	
# Filtr -------------------------------------------------------------- #

$(FILT_OBJ_DIR)/%.o: $(FILT_DIR)/%.cpp
	$(COMPILE) $< -o $@

$(FILT_OBJ_DIR)/%.o: $(FILT_COND_DIR)/%.cpp
	$(COMPILE) $< -o $@
	
# Smtp --------------------------------------------------------------- #

$(SMTP_OBJ_DIR)/%.o: $(SMTP_DATA_DIR)/%.cpp
	$(COMPILE) $< -o $@

$(SMTP_OBJ_DIR)/%.o: $(SMTP_CORE_DIR)/%.cpp
	$(COMPILE) $< -o $@

# System ------------------------------------------------------------- #

$(SYST_OBJ_DIR)/%.o: $(SYST_DIR)/%.cpp
	$(COMPILE) $< -o $@
 
# Utils -------------------------------------------------------------- #

$(UTIL_OBJ_DIR)/%.o: $(UTIL_DIR)/%.cpp
	$(COMPILE) $< -o $@

# -------------------------------------------------------------------- #

demon:
	#Tworze skrypt program.d do uruchamiania programu w trybie demona... program.d
	@rm -f program.d
	@echo '#!/bin/sh' > program.d
	@echo '# skrypt do uruchamiania programu w trybie demona ' >> program.d
	@echo 'python ./src/www/manage.py runserver 8000 1>/dev/null 2>/dev/null &' >> program.d
	@echo './r &' >> program.d 
	@chmod 755 program.d
	
clean:
	rm -f $(UTIL_OBJ_DIR)/*.o
	rm -f $(SMTP_OBJ_DIR)/*.o
	rm -f $(MIME_OBJ_DIR)/*.o
	rm -f $(FILT_OBJ_DIR)/*.o
	rm -f $(SYST_OBJ_DIR)/*.o
	rm -f $(CONF_OBJ_DIR)/*.o
	rm -f $(COMM_OBJ_DIR)/*.o
	rm -f $(DB_OBJ_DIR)/*.o
	rm -f $(LOGS_OBJ_DIR)/*.o
	rm -f $(PARS_OBJ_DIR)/*.o
	rm -f $(PARS_DIR)/scanner.yy.cc
	rm -f $(PARS_DIR)/BisonParser.cc

cleanall:
	make clean
	rm -f program.d
	rm -f program
